// 导入路由
import router from '@/router'
import nprogress from 'nprogress'
import 'nprogress/nprogress.css'
// 导入store
import store from '@/store'
// 导入动态路由
import { asyncRoutes } from '@/router'
// 定义一个白名单 目的：用户不需要登录就可以访问的页面
const whiteList = ['/login', '/404', '/error_500', '/networkError']
// 路由前置导航守卫

router.beforeEach(async (to, from, next) => {
  nprogress.start()
  if (store.getters.token) {
    if (to.path === '/login') {
      next('/')
      nprogress.done()
    } else if (to.path === '/error_500' || to.path === '/networkError') {
      next()
      nprogress.done()
    } else {
      // 确定访问的是后台页面 获取用户的基本资料
      // 先判断是否已经获取过资料了 根据userId
      if (!store.state.user.userInfo.sysUser.id) {
        const routerType = store.getters.routerType
        const result = await store.dispatch('user/getUserInfo')
        const res = result.data;
        if (result.code === 200) {
          // 筛选出来可以访问的路由
          // const filterRoutes = asyncRoutes
          const filterRoutes = []
          asyncRoutes.forEach(item => {
            let menu = null;
            if (res.menuList.some(it => {
              if (it.url === item.name) {
                menu = { ...it };
              }
              return it.url === item.name
            })) {
              filterRoutes.push({
                path: item.path,
                alwaysShow: true,
                // sort: newRoute.sort,
                component: item.component,
                redirect: item.redirect,
                hidden: !(item.meta.routerType === routerType),
                name: item.name,
                meta: { ...item.meta, title: menu.menuName },
                children: [...item.children]
              })
            }
          })
          // 筛选子路由添加排序字段
          /**
           * @TODO 此处若要修改不选查询的时候没有菜单的功能，则需要在路由中加meta根据meta来匹配，不需要前面的按照url来匹配
           */
          filterRoutes.forEach(item => {
            item.children = item.children.filter(child => {
              // return res.menuList.some(it => {
              //   child.meta.sort = it.sort
              //   return it.url === child.name
              // }) || res.permissionList.some(ele => { // 筛选hidden-true的路由
              //   return ele === child.meta.anniu
              // })
              let menu = res.menuList.find(it => it.url === child.name);
              if (menu) child.meta = { ...child.meta, title: menu.menuName };
              return res.permissionList.some(ele => { // 筛选hidden-true的路由
                child.meta.sort = ele.sort
                return ele === child.meta.anniu
              })
            })
          })
          // 调用修改用户可以访问路由规则的mutation
          filterRoutes.forEach(item => {
            item.children.sort((a, b) => {
              return a.meta.sort - b.meta.sort
            })
          })
          // console.log(filterRoutes, 'filterRoutes')
          store.commit('user/setRoutes', filterRoutes)
          // 动态路由添加规则
          router.addRoutes([...filterRoutes, { path: '*', redirect: '/404', hidden: true }])
          // 没权限提醒
          if (router.match(to.path).path === '/404') {
            router.app.$message.warning('权限不足')
            nprogress.done()
            next('/')
          } else {
            // 修改vue-router的已知缺陷，需要重新执行要跳转的地址
            next({ path: to.path, query: { ...to.query }, params: { ...to.params } })
          }
        } else if(res.code === 500) {
          next('/error_500')
        }
        // next({ path: to.path, query: { ...to.query }, params: { ...to.params }})
      } else {
        // 放行
        // 没权限提醒
        if (router.match(to.path).path === '/404') {
          next(from.path)
          router.app.$message.warning('权限不足')
          nprogress.done()
          next('/')
        } else {
          next()
        }
        // next()
      }
    }
  } else {
    // 没有登录  => 判断有没有在白名单内
    if (whiteList.includes(to.path)) {
      // 在白名单内，放行
      console.log('222')
      next()
    } else {
      // 不在 返回登录页面
      // 当next里面``1
      console.log(111)					//	传入一个path之后，路由没有执行后置守卫
      next('/login')
      nprogress.done()
    }
  }
})

// 路由后置守卫
router.afterEach(route => {
  // 关闭进度条：nprogress.done()
  // console.log("后置路由守卫")
  nprogress.done()
})

